package fichier;
import java.awt.Color;
import java.io.*;
import modele.*;

import org.jdom.*;
import org.jdom.input.*;
import org.jdom.Document;

import java.util.List;
import java.util.Iterator;
import java.util.Vector;

public class ParserXml
{
	private static Document document;
	private static Element racine;

	public ParserXml(File fichier)
	{
		// On cree une instance de SAXBuilder
		SAXBuilder sxb = new SAXBuilder();
		try
		{
			//On cree un nouveau document JDOM avec en argument le fichier XML
			//Le parsing est termine ;)
			document = sxb.build(fichier);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}

		//On initialise un nouvel element racine avec l'element racine du document.
		racine = document.getRootElement();
		//afficheOptimisation();
		//afficheSubject();
	}
	
	public boolean is3D()
	{
		return racine.getAttribute("type").getValue().equals("3D");
	}
	
	public Object recupererFonctionAOptimiser()
	{
		// On cree une List contenant tous les noeuds de l'Element racine
		Element e=racine.getChild("optimisation");
		String sens=e.getAttribute("sens").getValue();
		
		Vector<Float> listeVar = new Vector<Float>();
		List list=e.getChildren();
		Iterator<Element>it=list.iterator();
		while(it.hasNext())
		{
			Element courant=it.next();
			if(courant.getName().equals("variable"))
			{
				listeVar.addElement(Float.parseFloat(courant.getText()));
			}
		}
		
		FonctionAOptimiser2D fct2D;
		FonctionAOptimiser3D fct3D;
		
		if(!this.is3D())
		{
			float x1 = listeVar.elementAt(0);
			float x2 = listeVar.elementAt(1);
			
			if(sens.equals("MINIMIZE"))
			{
				fct2D = new FonctionAOptimiser2D(x1,x2,false);
			}
			else
			{
				fct2D = new FonctionAOptimiser2D(x1,x2,true);
			}
			return fct2D;
		}
		else
		{
			float x1 = listeVar.elementAt(0);
			float x2 = listeVar.elementAt(1);
			float x3 = listeVar.elementAt(2);
			
			fct3D = new FonctionAOptimiser3D(x1,x2,x3,sens.equals("MINIMIZE"));
			return fct3D;
		}
	}
	
	public Vector recupererListeEquations()
	{
		Vector listeEquations = new Vector();
		
		//On cree une List contenant tous les noeuds de l'Element racine
		Element e=racine.getChild("subject_to");
		
		List list=e.getChildren();
		Iterator<Element>it=list.iterator();
		
		while(it.hasNext())
		{
			Element contrainte=it.next();
			
			Vector<Float> listeVar = new Vector<Float>();
			String operateur = "";
			Float partieD = null;
			
			// recuperation de la couleur
			int rouge = Integer.parseInt(contrainte.getAttribute("r").getValue());
			int vert = Integer.parseInt(contrainte.getAttribute("v").getValue());
			int bleu = Integer.parseInt(contrainte.getAttribute("b").getValue());
			Color couleur = new Color(rouge,vert,bleu);
			
			// recuperation du libelle
			String libelle = contrainte.getAttribute("libelle").getValue();
			
			List list2=contrainte.getChildren();
			Iterator<Element>it2=list2.iterator();
			
			while(it2.hasNext())
			{
				Element courant=it2.next();
				if(courant.getName().equals("variable"))
				{
					listeVar.addElement(Float.parseFloat(courant.getText()));
				}
				if(courant.getName().equals("signe"))
				{
					if(courant.getText().equals("INF_EQ"))
					{
						operateur = "<=";
					}
					if(courant.getText().equals("SUP_EQ"))
					{
						operateur = ">=";
					}
				}
				if(courant.getName().equals("partie_droite"))
				{
					partieD = Float.parseFloat(courant.getText());
				}
			}
			
			if(!this.is3D())
			{
				float x1 = listeVar.elementAt(0);
				float x2 = listeVar.elementAt(1);
				listeEquations.addElement(new Equation2D(x1,x2,operateur,partieD,couleur,libelle));
			}
			else
			{
				float x1 = listeVar.elementAt(0);
				float x2 = listeVar.elementAt(1);
				float x3 = listeVar.elementAt(2);
				listeEquations.addElement(new Equation3D(x1,x2,x3,operateur,partieD,couleur,libelle));
			}			
		}
		return listeEquations;
	}
}